package main;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import operations.BiOperation;
import operations.MonoOperation;
import operations.Operation;
import polynomials.Monom;
import polynomials.Polynomial;
/**
* Creates the graphical user interface through which the user can give input to
* the application and also get the output
*
* @author Cosmina
*
*/
public class GUI implements ActionListener {
private JFrame frame = new JFrame("Polynomials");
private JPanel bigPanel = new JPanel();
private JPanel polyPanel = new JPanel();
private JPanel operationPanel = new JPanel();
private JPanel resultPanel = new JPanel();
private JTextField poly1TextField = new JTextField();
private JTextField poly2TextField = new JTextField();
private JTextField degree1TextField = new JTextField();
private JTextField degree2TextField = new JTextField();
private JTextField evaluateTextField = new JTextField();
private JTextArea resultTextArea = new JTextArea();
private JButton addPoly1 = new JButton("Add Poly1");
private JButton addPoly2 = new JButton("Add Poly2");
private JButton add = new JButton("+");
private JButton subtract = new JButton("-");
private JButton multiply = new JButton("X");
private JButton differentiate1 = new JButton("Derivate p1");
private JButton differentiate2 = new JButton("Derivate p2");
private JButton integrate1 = new JButton("Integrate p1");
private JButton integrate2 = new JButton("Integrate p2");
private JButton evaluate1 = new JButton("Evaluate p1");
private JButton evaluate2 = new JButton("Evaluate p2");
private JButton empty = new JButton("");
private JLabel evaluatePoint = new JLabel("Add point:");
private String poly1, poly2;
private int degree1, degree2, point;
private Tokens token1, token2;
private Monom m;
private Polynomial p;
private Polynomial p1 = new Polynomial();
private Polynomial p2 = new Polynomial();
private Operation monoOp = new MonoOperation();
private Operation biOp = new BiOperation();
public GUI() {
showInstructions();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(700, 400);
frame.setLocationRelativeTo(null);
bigPanel.setLayout(new GridLayout(3, 1));
bigPanel.setBackground(Color.WHITE);
bigPanel.setVisible(true);
polyPanel.setLayout(new GridLayout(2, 3));
degree1TextField.setEditable(true);
degree1TextField.setFont(new Font("Serif", Font.LAYOUT_LEFT_TO_RIGHT, 15));
degree1TextField.addActionListener(this);
poly1TextField.setPreferredSize(new Dimension(300, 30));
poly1TextField.setEditable(true);
poly1TextField.setFont(new Font("Serif", Font.LAYOUT_LEFT_TO_RIGHT, 15));
poly1TextField.addActionListener(this);
degree2TextField.setEditable(true);
degree2TextField.setFont(new Font("Serif", Font.LAYOUT_LEFT_TO_RIGHT, 15));
degree2TextField.addActionListener(this);
poly2TextField.setPreferredSize(new Dimension(300, 30));
poly2TextField.setEditable(true);
poly2TextField.setFont(new Font("Serif", Font.LAYOUT_LEFT_TO_RIGHT, 15));
poly2TextField.addActionListener(this);
addPoly1.addActionListener(this);
addPoly1.setActionCommand("addPoly1");
addPoly2.addActionListener(this);
addPoly2.setActionCommand("addPoly2");
polyPanel.add(degree1TextField);
polyPanel.add(poly1TextField);
polyPanel.add(addPoly1);
polyPanel.add(degree2TextField);
polyPanel.add(poly2TextField);
polyPanel.add(addPoly2);
operationPanel.setLayout(new GridLayout(3, 4));
evaluateTextField.setEditable(true);
evaluateTextField.setFont(new Font("Serif", Font.LAYOUT_LEFT_TO_RIGHT, 15));
evaluateTextField.addActionListener(this);
add.addActionListener(this);
add.setActionCommand("add");
subtract.addActionListener(this);
subtract.setActionCommand("substract");
multiply.addActionListener(this);
multiply.setActionCommand("multiply");
differentiate1.addActionListener(this);
differentiate1.setActionCommand("derivate1");
differentiate2.addActionListener(this);
differentiate2.setActionCommand("derivate2");
integrate1.addActionListener(this);
integrate1.setActionCommand("integrate1");
integrate2.addActionListener(this);
integrate2.setActionCommand("integrate2");
evaluate1.addActionListener(this);
evaluate1.setActionCommand("evaluate1");
evaluate2.addActionListener(this);
evaluate2.setActionCommand("evaluate2");
operationPanel.add(add);
operationPanel.add(subtract);
operationPanel.add(multiply);
operationPanel.add(empty);
operationPanel.add(differentiate1);
operationPanel.add(differentiate2);
operationPanel.add(integrate1);
operationPanel.add(integrate2);
operationPanel.add(evaluatePoint);
operationPanel.add(evaluateTextField);
operationPanel.add(evaluate1);
operationPanel.add(evaluate2);
resultPanel.setLayout(new GridLayout(1, 1));
resultTextArea.setFont(new Font("Serif", Font.LAYOUT_LEFT_TO_RIGHT, 12));
resultTextArea.setVisible(true);
resultPanel.add(resultTextArea);
bigPanel.add(polyPanel);
bigPanel.add(operationPanel);
bigPanel.add(resultPanel);
frame.add(bigPanel);
frame.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("addPoly1")) {
degree1 = Integer.parseInt(degree1TextField.getText());
poly1 = poly1TextField.getText();
token1 = new Tokens(poly1, degree1);
p1.setDegree(degree1);
for (int j = 0; j < token1.getPolLength(); j++) {
m = new Monom(token1.getCoeff(j), token1.getPower(j));
p1.addMonom(m);
}
} else if (e.getActionCommand().equals("addPoly2")) {
degree2 = Integer.parseInt(degree2TextField.getText());
poly2 = poly2TextField.getText();
token2 = new Tokens(poly2, degree2);
p2.setDegree(degree2);
for (int j = 0; j < token2.getPolLength(); j++) {
m = new Monom(token2.getCoeff(j), token2.getPower(j));
p2.addMonom(m);
}
} else if (e.getActionCommand().equals("add")) {
resultTextArea.setText("");
p = biOp.add(p1, p2);
for (Monom m : p.getArray()) {
resultTextArea.append(m.toString());
}
} else if (e.getActionCommand().equals("substract")) {
resultTextArea.setText("");
p = biOp.subtract(p1, p2);
for (Monom m : p.getArray()) {
resultTextArea.append(m.toString());
}
} else if (e.getActionCommand().equals("multiply")) {
resultTextArea.setText("");
p = biOp.multiply(p1, p2);
for (Monom m : p.getArray()) {
resultTextArea.append(m.toString());
}
} else if (e.getActionCommand().equals("derivate1")) {
resultTextArea.setText("");
p = monoOp.differentiate(p1);
for (Monom m : p.getArray()) {
resultTextArea.append(m.toString());
}
} else if (e.getActionCommand().equals("derivate2")) {
resultTextArea.setText("");
p = monoOp.differentiate(p2);
for (Monom m : p.getArray()) {
resultTextArea.append(m.toString());
}
} else if (e.getActionCommand().equals("integrate1")) {
int i = 0;
resultTextArea.setText("");
p = monoOp.integrate(p1);
for (Monom m : p.getArray()) {
if (i != p.getArray().size() - 1) {
float coeff = (float) m.getCoeff() / m.getPower();
resultTextArea.append(coeff + "X^" + m.getPower() + "+");
i++;
} else
resultTextArea.append(m.toString());
}
} else if (e.getActionCommand().equals("integrate2")) {
int i = 0;
resultTextArea.setText("");
p = monoOp.integrate(p2);
for (Monom m : p.getArray()) {
if (i != p.getArray().size() - 1) {
float coeff = (float) m.getCoeff() / m.getPower();
resultTextArea.append(coeff + "X^" + m.getPower() + "+");
i++;
} else
resultTextArea.append(m.toString());
}
} else if (e.getActionCommand().equals("evaluate1")) {
resultTextArea.setText("");
int p = Integer.parseInt(evaluateTextField.getText());
point = monoOp.evaluatePolyAtPoint(p, p1);
String ps = Integer.toString(point);
resultTextArea.append(ps);
} else if (e.getActionCommand().equals("evaluate2")) {
resultTextArea.setText("");
int p = Integer.parseInt(evaluateTextField.getText());
point = monoOp.evaluatePolyAtPoint(p, p2);
String ps = Integer.toString(point);
resultTextArea.append(ps);
}
}
public void showInstructions() {
JOptionPane.showMessageDialog(null,
"First you must add the degree of the polynom in the first text field.\n Then you must enter the polynoms in the following way\naX^p1 +bX^p2 +... +zX^pn\nThe coefficients can be negative too.\nIn order to save the polynoms click the 'Add poly' button near the text field\nNext, choose the operation you want to be performed\n");
}
}